### 第09课 电机的驱动和调速

#### 9.1 项目介绍：

想要让智能小车跑起来，光有电机是不够的，我们还需要一个“大力士”来帮Arduino控制电机。这个“大力士”就是电机驱动模块。

在本课中，我们将学习如何使用 L298P 电机驱动扩展板。L298P 是一款非常经典且强大的电机驱动芯片，它可以同时驱动两个直流电机，最大电流可达 2A。通过它，我们可以轻松控制小车的前进、后退、转弯以及速度。


#### 9.2 元件知识：

为了简化接线，我们使用了一款基于 L298P 设计的电机驱动扩展板。这块板子可以直接插接在 Arduino 开发板上（就像戴帽子一样），这种设计叫做 “Shield（盾板）” 或 “扩展板”。

![](../../img/image56.png)

![](../../img/image57.jpg)

#### 9.3 驱动原理与控制逻辑：

**1\. 引脚定义**

根据扩展板的电路设计，Arduino 与电机的连接关系如下：

| 电机通道 | 方向控制引脚 (Digital) | 速度控制引脚 (PWM)|对应物理电机 |
| :--: | :--: | :--: | :--: |
| 电机 A | D2 | D6 | M3, M4 (右侧电机) |
| 电机 B | D4 | D5 | M1, M2 (左侧电机) |

<span style="color: rgb(255, 76, 65);">**注意：**</span> 不同批次的小车电机编号可能不同，请以实际接线为准。通常 A 组(A1/A2)控制一侧的两个电机并联，B 组(B1/B2)控制另一侧的两个电机并联。

**2\. 运动逻辑表**

通过组合方向引脚的高低电平和速度引脚的 PWM 值，我们可以实现各种动作。PWM 值的范围是 0-255，数值越大，电机转速越快。

| 动作 | D2(方向A) | D6 (速度A) | 电机A状态 | D4 (方向B) | D5(速度B) | 电机B状态 |
| --- | --- | --- | --- | --- | --- | --- |
| 前进 | HIGH | 200 | 正转 | HIGH | 200 | 正转 |
| 后退 | LOW | 200 | 反转 | LOW | 200 | 反转 |
| 左旋转 | HIGH | 200 | 正转 | LOW | 200 | 反转 |
| 右旋转 | LOW | 200 | 反转 | HIGH | 200 | 正转 |
| 停止 | / | 0 | 停止 | / | 0 | 停止 |


- 右旋转原理：左侧电机正转，右侧电机反转，车身向右原地旋转。

- 左旋转原理：左侧电机反转，右侧电机正转，车身向左原地旋转。


#### 9.4 项目组件：

| 组装好的智能车(<span style="color: rgb(255, 76, 65);">未插上蓝牙模块</span>) *1 |USB线 *1 | 5号(1.5V)电池 *6（电池自备） |
| --- | --- | --- | 
| ![](../../img/image4.png) | ![](../../img/image8.png)| ![](../../img/image11.png) |


#### 9.5 接线图：

⚠️ 特别注意：4WD智能车已经组装好了，这里不需要把4个电机拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！

| 电机 | 电机驱动扩展板 | 
| :--: | :--: | 
| 左侧电机（M1） | B2 |
| 左侧电机（M2） | B1 |
| 右侧电机（M3） | A1 |
| 右侧电机（M4） | A2 | 

![](../../img/image59.png)

⚠️ <span style="color: rgb(255, 76, 65);">**特别注意：**</span>

- 接线时请确保电源断开(拔掉Arduino主控板上的USB线或将电机驱动扩展板上的拨码开关拨到 “<span style="color: rgb(255, 76, 65);">**OFF**</span>” 端)，避免短路。

- 电源连接：电池盒电源接到电机驱动扩展板的 BAT 接口（注意正负极不要接反），端口正反面，请勿反插，否则会损坏端口。

- 电池正负极切勿接反，否则可能烧毁电机驱动扩展板。

- 电机驱动扩展板上的拨码开关拨到 “<span style="color: rgb(255, 76, 65);">**ON**</span>” 端。

- 电机线如果接反导致方向不对，可以通过交换电机两根线的位置，或者修改代码中的高低电平来修正。



#### 9.6 示例代码1：基础运动控制

**基础运动：以固定速度（PWM 200）测试前进、后退、左转、右转。**

⚠️ <span style="color: rgb(255, 76, 65);">**重要提示：**</span>

- <span style="color: rgb(172, 57, 255);">**上传示例代码前，请务必拔掉蓝牙模块！ 因为蓝牙模块也占用Arduino的串口通信（TX/RX），如果不拔掉，示例代码上传会失败。**</span>

![](../../img/kidsblock_test8_1.png)

#### 9.7 项目结果1：

⚠️ <span style="color: rgb(255, 76, 65);">**重要提示：**</span>

- <span style="color: rgb(172, 57, 255);">**上传示例代码前，请务必拔掉蓝牙模块！ 因为蓝牙模块也占用Arduino的串口通信（TX/RX），如果不拔掉，示例代码上传会失败。**</span>

外接电源，将电机驱动扩展板上的拨码开关拨到 “<span style="color: rgb(255, 76, 65);">**ON**</span>” 端，上电后。选择好正确的设备（Keyes 4WD Robot）和 对应的端口（COMxx），然后单击 ![upload](../../img/upload.png) 按钮上传示例代码至Arduino控制板。

代码上传成功后，小车将按照 “前进 -> 后退 -> 左转 -> 右转 -> 停止” 的顺序循环动作，每个动作持续 1 秒，速度较快且均匀。

![](../../img/A13.gif)

#### 9.8 代码说明：

![](../../img/0111-17.png)

电机的旋转方向取决于电流的方向。L298P 芯片通过改变内部开关的状态来改变电流方向。我们只需要向方向引脚（D2, D4）发送高电平（HIGH）或低电平（LOW）即可控制正反转。

Arduino 的数字引脚只能输出 0V 或 5V，无法直接输出中间电压。但是，通过 PWM（脉冲宽度调制） 技术，我们可以快速地在 0V 和 5V 之间切换。

- PWM 值范围：0 ~ 255。

- 0：相当于始终为 0V，电机停止。

- 255：相当于始终为 5V（逻辑电平，实际驱动电压取决于外部电源），电机全速运转。

- 中间值：数值越大，高电平占比越高，电机平均电压越高，转速越快。

<span style="color: rgb(255, 76, 65);">**注意：**</span> 只有标有波浪号 "~" 的引脚（如: D3、D5、D6、D9、D10、D11）才支持 PWM 功能。本课使用的 D5 和 D6 正好具备此功能。

#### 9.9 示例代码2：变速运动控制

在这个代码中，我们降低了 PWM 值，并让转弯时的速度与直行不同，体验速度控制的效果。同时，电机的接线不变。

⚠️ <span style="color: rgb(255, 76, 65);">**重要提示：**</span>

- <span style="color: rgb(172, 57, 255);">**上传示例代码前，请务必拔掉蓝牙模块！ 因为蓝牙模块也占用Arduino的串口通信（TX/RX），如果不拔掉，示例代码上传会失败。**</span>

![](../../img/kidsblock_test8_2.png)

#### 9.10 项目结果2：

⚠️ <span style="color: rgb(255, 76, 65);">**重要提示：**</span>

- <span style="color: rgb(172, 57, 255);">**上传示例代码前，请务必拔掉蓝牙模块！ 因为蓝牙模块也占用Arduino的串口通信（TX/RX），如果不拔掉，示例代码上传会失败。**</span>

外接电源，将电机驱动扩展板上的拨码开关拨到 “<span style="color: rgb(255, 76, 65);">**ON**</span>” 端，上电后。选择好正确的设备（Keyes 4WD Robot）和 对应的端口（COMxx），然后单击 ![upload](../../img/upload.png) 按钮上传示例代码至Arduino控制板。

代码上传成功后，小车将按照 “前进 -> 后退 -> 左转 -> 右转 -> 停止” 的顺序循环动作，每个动作持续 1 秒，你会发现小车的整体速度变慢了。

![](../../img/A12.gif)

这是因为我们将 PWM 值从 200 降低到了 100 和 150。PWM 值越小，电机获得的平均电压越低，转速也就越慢。


#### 9.11 注意事项与常见问题：

**1\. 电机不动？**

- 检查电池是否有电，电压是否在 7-9V 之间。

- 检查电机驱动扩展板是否牢固地插在 Arduino 上。

- 检查电机接线是否接触良好。
    
    
**2\. 小车走不直？**
        
由于电机个体差异，即使给相同的 PWM 值，两边转速也可能不同。后续课程我们将学习如何通过软件调整左右电机的 PWM 差值来校正直线行驶。
    
**3\. 发热问题**
        
L298P芯片在大电流工作时会产生热量，这是正常现象。如果长时间堵转（车轮被卡住），芯片会过热保护甚至损坏，请避免长时间堵转。
